#ifndef DATAQUEUE_H
#define DATAQUEUE_H

#include <QObject>
#include <QQueue>
#include <QTimer>
#include <QMutex>
#include <QDateTime>
#include <QVector>
#include "dbmanager.h"

/**
 * @brief 数据队列类
 *
 * 功能：
 * - 内存缓存队列（支持掉电后数据暂存）
 * - 定时批量写入数据库（每5分钟）
 * - 断点续传逻辑
 * - 数据缺口检测和自动补全
 * - 线程安全
 */
class DataQueue : public QObject
{
    Q_OBJECT
    Q_PROPERTY(int queueSize READ queueSize NOTIFY queueSizeChanged)
    Q_PROPERTY(int totalCached READ totalCached NOTIFY totalCachedChanged)
    Q_PROPERTY(bool autoFlush READ autoFlush WRITE setAutoFlush NOTIFY autoFlushChanged)

public:
    /**
     * @brief 数据缺口结构
     */
    struct DataGap
    {
        int meterId;         ///< 电表ID
        QDateTime startTime; ///< 缺口开始时间
        QDateTime endTime;   ///< 缺口结束时间
        bool recovered;      ///< 是否已恢复
    };

    explicit DataQueue(DBManager *dbManager, QObject *parent = nullptr);
    ~DataQueue();

    /**
     * @brief 添加历史数据到缓存队列
     * @param data 历史数据
     */
    void enqueue(const HistoryData &data);

    /**
     * @brief 批量添加历史数据到缓存队列
     * @param dataList 历史数据列表
     */
    void enqueueBatch(const QVector<HistoryData> &dataList);

    /**
     * @brief 立即刷新队列（写入数据库）
     * @return 成功写入的数量
     */
    int flush();

    /**
     * @brief 清空队列
     */
    void clear();

    /**
     * @brief 获取队列大小
     */
    int queueSize() const { return m_dataQueue.size(); }

    /**
     * @brief 获取总缓存数量（累计）
     */
    int totalCached() const { return m_totalCached; }

    /**
     * @brief 启动自动刷新
     * @param intervalMs 刷新间隔（毫秒），默认5分钟
     */
    void startAutoFlush(int intervalMs = 300000);

    /**
     * @brief 停止自动刷新
     */
    void stopAutoFlush();

    /**
     * @brief 是否启用自动刷新
     */
    bool autoFlush() const { return m_autoFlush; }

    /**
     * @brief 设置自动刷新
     */
    void setAutoFlush(bool enable);

    /**
     * @brief 设置队列最大大小
     * @param maxSize 最大大小（超过后自动刷新）
     */
    void setMaxQueueSize(int maxSize) { m_maxQueueSize = maxSize; }

    /**
     * @brief 获取队列最大大小
     */
    int maxQueueSize() const { return m_maxQueueSize; }

signals:
    /**
     * @brief 队列大小改变信号
     */
    void queueSizeChanged();

    /**
     * @brief 总缓存数量改变信号
     */
    void totalCachedChanged();

    /**
     * @brief 自动刷新状态改变信号
     */
    void autoFlushChanged();

    /**
     * @brief 数据刷新完成信号
     * @param count 写入数量
     */
    void dataFlushed(int count);

    /**
     * @brief 队列满信号
     */
    void queueFull();

private slots:
    /**
     * @brief 自动刷新槽函数
     */
    void onAutoFlush();

private:
    DBManager *m_dbManager;          ///< 数据库管理器
    QQueue<HistoryData> m_dataQueue; ///< 数据队列
    mutable QMutex m_queueMutex;     ///< 队列互斥锁

    QTimer *m_autoFlushTimer; ///< 自动刷新定时器

    bool m_autoFlush;   ///< 是否启用自动刷新
    int m_maxQueueSize; ///< 队列最大大小（默认10000）
    int m_totalCached;  ///< 总缓存数量（累计）
};

#endif // DATAQUEUE_H
